const URL = require('url')

// 请求解析
function solveRequest (req, dataType) {
  // get请求
  if (/get/i.test(req.method)) {
    return solveQuery(req)
  }

  return new Promise((resolve, reject) => {
    //创建空字符叠加数据片段
    var data = ''
    //2.注册data事件接收数据（每当收到一段表单提交的数据，该方法会执行一次）
    req.on('data', function (chunk) {
      // chunk 默认是一个二进制数据，和 data 拼接会自动 toString
      data += chunk
    })

    // 3.当接收表单提交的数据完毕之后，就可以进一步处理了
    //注册end事件，所有数据接收完成会执行一次该方法
    req.on('end', function () {
      //（1）.对url进行解码（url会对中文进行编码）
      data = data.replace(/%/g, '%25')
      data = decodeURIComponent(data)
      /**post请求参数不能使用url模块解析，因为他不是一个url，而是一个请求体对象 */

      //（2）.使用querystring对url进行反序列化（解析url将&和=拆分成键值对），得到一个对象
      //querystring是nodejs内置的一个专用于处理url的模块，API只有四个，详情见nodejs官方文档
      // var dataObject = querystring.parse(data)
      let params = data
      // json转换
      if (['binary'].indexOf(dataType) === -1) {
        params = solveJSON(data)
      }
      // GET参数
      let query = {}
      try {
        // get参数解析
        query = URL.parse(req.url, true).query
      } catch (e) {
        query = {}
      }
      // 执行回调
      resolve({params, query})
    })

    // 错误
    req.on('error', function (e) {
      reject(e)
    })
  })
}

// 参数解析
function solveQuery (req) {
  return new Promise((resolve, reject) => {
    try {
      // get参数解析
      let params = URL.parse(req.url, true).query
      resolve({params})
    } catch (e) {
      reject(e)
    }
  })
}

/**
 * @function 转换为JSON
 * @return {Object}
 * */
function solveJSON (data) {
  let result = {}
  if (/^(\[|\{)[\S\s]*(\]|\})$/.test(data.trim())) {
    try {
      result = JSON.parse(data)
    } catch (e) {
      result = {}
    }
  }

  return result
}

module.exports = {
  solveRequest: solveRequest,
  solveQuery: solveQuery,
  solveJSON: solveJSON 
}
